bitkeeper revision 1.22.1.14 (3e4cfb9e8kov7wBkpF_IkW4uJSFJYw)
authorakw27@boulderdash.cl.cam.ac.uk <akw27@boulderdash.cl.cam.ac.uk>
Fri, 14 Feb 2003 14:22:22 +0000 (14:22 +0000)
committerakw27@boulderdash.cl.cam.ac.uk <akw27@boulderdash.cl.cam.ac.uk>
Fri, 14 Feb 2003 14:22:22 +0000 (14:22 +0000)
Extraneous interrupt removal.

xen-2.4.16/include/hypervisor-ifs/hypervisor-if.h
xen-2.4.16/net/dev.c
xenolinux-2.4.16-sparse/arch/xeno/drivers/network/network.c

index a0cfc7ae5916de6b097d645ccab6c03f78d8e4ec..2d6b84e83e0068441679417765d7f03a277da93e 100644 (file)
@@ -108,13 +108,6 @@ typedef struct
 #define EVENT_DIE      0x08 /* OS is about to be killed. Clean up please! */
 #define EVENT_NET_TX   0x10 /* packets for transmission. */
 #define EVENT_NET_RX   0x20 /* empty buffers for receive. */
-#define EVENT_NET2_TX  0x40 /* packets for transmission. */
-#define EVENT_NET2_RX  0x80 /* empty buffers for receive. */
-
-/* should these macros and the ones below test for range violation? */
-#define EVENT_NET_TX_FOR_VIF(x)    (EVENT_NET_TX << (2 * x))
-#define EVENT_NET_RX_FOR_VIF(x)    (EVENT_NET_RX << (2 * x))
-
 
 /* Bit offsets, as opposed to the above masks. */
 #define _EVENT_BLK_TX  0
@@ -123,11 +116,7 @@ typedef struct
 #define _EVENT_DIE     3
 #define _EVENT_NET_TX  4
 #define _EVENT_NET_RX  5
-#define _EVENT_NET2_TX 6
-#define _EVENT_NET2_RX 7
 
-#define _EVENT_NET_TX_FOR_VIF(x)    (_EVENT_NET_TX + (2 * x))
-#define _EVENT_NET_RX_FOR_VIF(x)    (_EVENT_NET_RX + (2 * x))
 
 /*
  * NB. We expect that this struct is smaller than a page.
index 39bd6699af6bec32331e4031616fd3a142dfc8ef..0e19d7a0a66561eab0207f3e967ca8a0ca0ab5e3 100644 (file)
 #define rtnl_unlock() ((void)0)
 #define dst_init() ((void)0)
 
+#if 1
+#define DPRINTK(_f, _a...) printk(_f , ## _a)
+#else 
+#define DPRINTK(_f, _a...) ((void)0)
+#endif
+
 // Ring defines:
 #define TX_RING_INC(_i)    (((_i)+1) & (TX_RING_SIZE-1))
 #define RX_RING_INC(_i)    (((_i)+1) & (RX_RING_SIZE-1))
@@ -1005,7 +1011,7 @@ void update_shared_ring(void)
                 __flush_tlb();
 
             if ( net_ring->rx_cons == net_ring->rx_event )
-                set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events);
+                set_bit(_EVENT_NET_RX, &s->events);
             
         }
     }
@@ -1153,7 +1159,7 @@ void flush_rx_queue(void)
                 }
                 net_ring->rx_cons = (i+1) & (RX_RING_SIZE-1);
                 if ( net_ring->rx_cons == net_ring->rx_event )
-                    set_bit(_EVENT_NET_RX_FOR_VIF(nvif), &s->events);
+                    set_bit(_EVENT_NET_RX, &s->events);
             }
             kfree_skb(skb);
         }
@@ -2222,14 +2228,14 @@ long do_net_update(void)
             
             if ( ((tx.addr & ~PAGE_MASK) + tx.size) >= PAGE_SIZE ) 
             {
-                printk("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size,
+                DPRINTK("tx.addr: %lx, size: %lu, end: %lu\n", tx.addr, tx.size,
                     (tx.addr &~PAGE_MASK) + tx.size);
                 continue;
                 //BUG();
             }
             
             if ( TX_RING_INC(i) == net_ring->tx_event )
-                set_bit(_EVENT_NET_TX_FOR_VIF(j), &shared->events);
+                set_bit(_EVENT_NET_TX, &shared->events);
 
             /* Map the skb in from the guest, and get it's delivery target.
              * We need this to know whether the packet is to be sent locally
index eef4f2dae6158efd3e12a1e9d38254ff4914aee8..87b1a97fdc74d1758c97bdd6a24e7373b6120d8a 100644 (file)
@@ -27,9 +27,6 @@
 #define NET_TX_IRQ _EVENT_NET_TX
 #define NET_RX_IRQ _EVENT_NET_RX
 
-#define NET_TX_IRQ_FOR_VIF(x) _EVENT_NET_TX_FOR_VIF(x)
-#define NET_RX_IRQ_FOR_VIF(x) _EVENT_NET_RX_FOR_VIF(x)
-
 #define TX_MAX_ENTRIES (TX_RING_SIZE - 2)
 #define RX_MAX_ENTRIES (RX_RING_SIZE - 2)
 
@@ -76,15 +73,7 @@ static int network_open(struct net_device *dev)
 {
     struct net_private *np = dev->priv;
     int error = 0;
-    char *rxlabel, *txlabel;
-
-    // This is inevitably not the right way to allocate a couple of static strings.
-    rxlabel = kmalloc(sizeof("net-rx- "), GFP_KERNEL);
-    txlabel = kmalloc(sizeof("net-tx- "), GFP_KERNEL);
-    if ((rxlabel == NULL) || (txlabel == NULL)) goto fail;
-    sprintf(rxlabel, "net-rx-%d", np->id);
-    sprintf(txlabel, "net-tx-%d", np->id);
-    
+
     np->rx_idx = np->tx_idx = np->tx_full = 0;
 
     memset(&np->stats, 0, sizeof(np->stats));
@@ -116,8 +105,8 @@ static int network_open(struct net_device *dev)
 
     network_alloc_rx_buffers(dev);
 
-    error = request_irq(NET_RX_IRQ_FOR_VIF(np->id), network_rx_int, 0, 
-                    rxlabel, dev);
+    error = request_irq(NET_RX_IRQ, network_rx_int, 0, 
+                    "net-rx", dev);
     if ( error )
     {
         printk(KERN_WARNING "%s: Could not allocate receive interrupt\n",
@@ -125,13 +114,13 @@ static int network_open(struct net_device *dev)
         goto fail;
     }
 
-    error = request_irq(NET_TX_IRQ_FOR_VIF(np->id), network_tx_int, 0, 
-                    txlabel, dev);
+    error = request_irq(NET_TX_IRQ, network_tx_int, 0, 
+                    "net-tx", dev);
     if ( error )
     {
         printk(KERN_WARNING "%s: Could not allocate transmit interrupt\n",
                dev->name);
-        free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev);
+        free_irq(NET_RX_IRQ, dev);
         goto fail;
     }
 
@@ -144,8 +133,6 @@ static int network_open(struct net_device *dev)
     return 0;
 
  fail:
-    if ( rxlabel ) kfree(rxlabel);
-    if ( txlabel ) kfree(txlabel);
     if ( np->net_ring->rx_ring ) kfree(np->net_ring->rx_ring);
     if ( np->net_ring->tx_ring ) kfree(np->net_ring->tx_ring);
     if ( np->rx_skb_ring ) kfree(np->rx_skb_ring);
@@ -293,6 +280,16 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
 //print_range(skb->data + ETH_HLEN + 8, 20);
 //printk("skb->len is %u in guestOS (expected fraglen: %u).\n", skb->len, skb->len - (ETH_HLEN + 8));
     i = np->net_ring->tx_prod;
+
+    if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE )
+    {
+        struct sk_buff *new_skb = alloc_skb(RX_BUF_SIZE, GFP_KERNEL);
+        skb_put(new_skb, skb->len);
+        memcpy(new_skb->data, skb->data, skb->len);
+        kfree_skb(skb);
+        skb = new_skb;
+    }   
+    
     np->tx_skb_ring[i] = skb;
     np->net_ring->tx_ring[i].addr 
         = (unsigned long)phys_to_machine(virt_to_phys(skb->data));
@@ -387,8 +384,8 @@ int network_close(struct net_device *dev)
     struct net_private *np = dev->priv;
 
     netif_stop_queue(dev);
-    free_irq(NET_RX_IRQ_FOR_VIF(np->id), dev);
-    free_irq(NET_TX_IRQ_FOR_VIF(np->id), dev);
+    free_irq(NET_RX_IRQ, dev);
+    free_irq(NET_TX_IRQ, dev);
     network_free_rx_buffers(dev);
     kfree(np->net_ring->rx_ring);
     kfree(np->net_ring->tx_ring);